package ca.clarity.hms.activity;

import java.text.DecimalFormat;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import ca.clarity.hms.activity.dbtest.MainActivity;

/**
 * 메인화면 activity class 이다.
 * <p/>
 * 각 기능 버튼들을 출력하는 메인화면이다.
 * <p/>
 * 1. 환자 등록 버튼. 2. 환자 추적 버튼. 3. 싱크 버튼. 4. 로그아웃 버튼. 5. 세팅 버튼.
 *
 * @author Junghun, Shin
 */
public class HmsLandingActivity extends Activity {

    public static String TAG = HmsLandingActivity.class.getSimpleName();

    // 위도.
    TextView landingLatitudeTextView;

    // 경도.
    TextView landingLongitudeTextView;

    // 네트워크 정보.
    TextView landingNetworkTextView;

    // 메모리 정보.
    TextView landingMemoryTextView;

    // 환자 등록 버튼.
    Button landingPatientRegistrationButton;

    // 환자 추적 버튼.
    Button landingFollowUpButton;

    // 싱크 버튼.
    Button landingSyncButton;

    // 로그아웃 버튼.
    Button landingLogoutButton;

    // 세팅 버튼.
    Button landingSettingButton;
    
    // 현재 위치를 가져온다.
    private static final int THREAD_LOCATION = 101;

    // 네트워크 연결상태를 가져 온다.
    private static final int THREAD_IS_ONLINE = 102;

    // 사용가능한 메모리 사용량을 가져 온다.
    private static final int THREAD_AVAILABLE_MEMORY = 103;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hms_landing);

        // 위도.
        landingLatitudeTextView = (TextView) findViewById(R.id.landingLatitudeTextView);

        // 경도.
        landingLongitudeTextView = (TextView) findViewById(R.id.landingLongitudeTextView);

        // 네트워크 정보.
        landingNetworkTextView = (TextView) findViewById(R.id.landingNetworkTextView);

        // 메모리 정보.
        landingMemoryTextView = (TextView) findViewById(R.id.landingMemoryTextView);

        // 환자 등록 버튼을 설정 한다.
        landingPatientRegistrationButton = (Button) findViewById(R.id.landingPatientRegistrationButton);
        landingPatientRegistrationButton
                .setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // 환자 목록 화면을 출력 한다.
                        Intent i = new Intent(HmsLandingActivity.this,
                                HmsPatientRegistrationActivity.class);
                        startActivity(i);
                    }
                });

        // Post-surgery Follow-Up Page
        landingFollowUpButton = (Button) findViewById(R.id.landingFollowUpButton);
        landingFollowUpButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(HmsLandingActivity.this,
                        Hms4thPatientListActivity.class);
                startActivity(intent);

            }
        });

        // Sync Page
        landingSyncButton = (Button) findViewById(R.id.landingSyncButton);
        landingSyncButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(HmsLandingActivity.this,
                        HmsSyncPatientListActivity.class);
                startActivity(intent);

            }
        });

        // Logout
        landingLogoutButton = (Button) findViewById(R.id.landingLogoutButton);
        landingLogoutButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(HmsLandingActivity.this,
                        HmsLoginActivity.class);
                startActivity(intent);

            }
        });

        // Setting Page
        landingSettingButton = (Button) findViewById(R.id.landingSettingButton);
        landingSettingButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(HmsLandingActivity.this,
                        HmsSettingActivity.class);
                startActivity(intent);

            }
        });


        // DB Test Page
//        Button dbTestButton = (Button) findViewById(R.id.dbTestButton);
//        dbTestButton.setOnClickListener(new View.OnClickListener() {
//
//            @Override
//            public void onClick(View v) {
//                Intent intent = new Intent(HmsLandingActivity.this, MainActivity.class);
//                startActivity(intent);
//
//            }
//        });
        
        // 현재 위치를 가져 온다.
        mHandler.sendMessage(mHandler.obtainMessage(THREAD_LOCATION));

        // 네트워크 연결상태를 가져 온다.
        mHandler.sendMessage(mHandler.obtainMessage(THREAD_IS_ONLINE));

        // 사용가능한 메모리 양을 가져 온다.
        mHandler.sendMessage(mHandler.obtainMessage(THREAD_AVAILABLE_MEMORY));
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        // getMenuInflater().inflate(R.menu.hms_village, menu);
        return true;
    }

    /**
     * Handler 를 정의한다.
     * 모든 Thread 를 등록해 놓고 필요할때 호출한다.
     */
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case THREAD_LOCATION:
                    getLocationInformation();
                    break;
                case THREAD_IS_ONLINE:
                    isOnline();
                    break;
                case THREAD_AVAILABLE_MEMORY:
                    getCurrentMemory();
                    break;
            }
        }
    };
    
    /**
     * 현재 위치의 위도, 경도를 구한다.
     */
    public void getLocationInformation() {

        // 위도, 경도는 소숫점 두자리까지 구한다. 소숫점 셋째자리 이하는 반올림으로 처리 한다.
        String pattern = ".##";

        DecimalFormat decimalFormat = new DecimalFormat(pattern);

        LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

        // 화면에 출력 한다.
        landingLatitudeTextView.setText(decimalFormat.format(location.getLatitude()) + "");
        landingLongitudeTextView.setText(decimalFormat.format(location.getLongitude()) + "");
    }

    /**
     * 네트워크 연결상태를 확인 한다.
     *
     * @return
     */
    private void isOnline() {

        String result;

        try {
            ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo.State wifi = conMan.getNetworkInfo(1).getState(); // wifi

            NetworkInfo.State mobile = conMan.getNetworkInfo(0).getState(); // mobile ConnectivityManager.TYPE_MOBILE

            if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING) {
                result = "Connected";
            } else if (mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING) {
                result = "Connected";
            } else {
                result = "Not Connected";
            }

        } catch (NullPointerException e) {
            result = "Not Connected";
        }

        // 화면에 출력 한다.
        landingNetworkTextView.setText(result);
    }

    /**
     * 사용가능한 메모리를 가져 온다.
     */
    private void getCurrentMemory() {
        ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
        ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        activityManager.getMemoryInfo(mi);
        long availableMegs = mi.availMem / 1048576L;

        // 화면에 출력 한다.
        landingMemoryTextView.setText(availableMegs + " M");
    }
}
